Re add java tree, tree back in correct state now!
[f432xdd.git] / java / Graph Editor / src / controllers / SelectionController.java
blobd7bb51c68f52e07214c620f0fd2f60d909225cb1
1 package controllers;
3 import interfaces.*;
5 import java.awt.event.KeyEvent;
6 import java.awt.event.KeyListener;
7 import java.awt.event.MouseEvent;
8 import java.awt.event.MouseListener;
9 import java.awt.event.MouseMotionListener;
11 import models.GraphModel;
12 import models.GraphVertex;
14 import controllers.actions.AddEdge;
15 import controllers.actions.Move;
16 import controllers.actions.Rename;
18 public class SelectionController implements MouseListener,MouseMotionListener,KeyListener{
19 private GraphPanel object = null;
20 private GraphFrame frame = null;
21 private GraphVertex selectedObject = null;
22 private GraphModel model = null;
24 private String typedStr;
25 private String originalName;
26 private boolean isChangingName;
27 private int OriginalNameLength;
29 private boolean isAddingEdge;
30 private GraphVertex edgeObject1;
33 private int clickX = 0;
34 private int clickY = 0;
35 private int mouseClickX =0;
36 private int mouseClickY =0;
38 private int mouseX = 0;
39 private int mouseY = 0;
41 public int getMouseX(){
42 return mouseX;
44 public int getMouseY(){
45 return mouseY;
49 public SelectionController(GraphFrame frame, GraphModel model){
50 isChangingName = false;
51 isAddingEdge = false;
52 this.frame = frame;
53 frame.setSelectionController(this);
54 frame.addKeyListener(this);
56 setObject(frame.getPanel());
57 setModel(model);
60 public void doAddEdge()
62 if(isChangingName){
63 this.doChangeName();
65 isAddingEdge = true;
66 edgeObject1 = this.getSelectedVertex();
69 public boolean isAddingEdge(){
70 return isAddingEdge;
73 private void finishAddingEdge(){
74 frame.addAction(new AddEdge(edgeObject1,this.getSelectedVertex(),this));
75 isAddingEdge = false;
78 public GraphModel getModel() {
79 return model;
81 public void setSelected(GraphVertex o)
83 frame.selectedObject(o != null);
84 if(isChangingName)
85 this.doChangeName();
87 if(selectedObject != null)
88 selectedObject.setSelected(false);
89 selectedObject = o;
91 if(selectedObject != null){
92 o.setSelected(true);
93 if(isAddingEdge){
94 finishAddingEdge();
96 }else{
97 isAddingEdge = false; // Didn't click object, cancel action
100 public GraphVertex getSelectedVertex()
102 return selectedObject;
105 public void removeSelected()
107 this.setSelected(null);
111 public void setObject(GraphPanel panel){
112 if(object != null){
113 object.removeMouseListener(this);
114 object.removeMouseMotionListener(this);
115 object.removeKeyListener(this);
117 object = panel;
118 object.addMouseListener(this);
119 object.addMouseMotionListener(this);
120 object.addKeyListener(this);
123 public void setModel(GraphModel model){
124 removeSelected();
125 this.model = model;
129 // Called when the typing stops, Either Return has been pressed or a
130 // other object has been selected.
131 private void doChangeName(){
132 selectedObject.setName(originalName);
133 this.frame.addAction(new Rename(typedStr,this));
134 this.isChangingName = false;
137 public GraphPanel getPanel()
139 return this.object;
142 private void doCancelNameChange(){
143 selectedObject.setName(this.originalName);
144 selectedObject.setWidth(this.OriginalNameLength);
145 isChangingName = false;
149 private void handleDoubleClick()
151 if(selectedObject != null){
152 this.typedStr = "";
153 isChangingName = true;
154 originalName = selectedObject.getName();
155 OriginalNameLength = selectedObject.getWidth();
159 public void mouseClicked(MouseEvent arg0) {
160 if(arg0.getButton() == MouseEvent.BUTTON1){
161 if(arg0.getClickCount() == 2){
162 handleDoubleClick();
163 }else{
164 this.setSelected(model.getGraphByCoordinate(arg0.getX(), arg0.getY()));
169 public void mouseEntered(MouseEvent arg0) {
172 public void mouseExited(MouseEvent arg0) {
175 public void mousePressed(MouseEvent arg0) {
176 this.setSelected(model.getGraphByCoordinate(arg0.getX(), arg0.getY()));
178 clickX = arg0.getX();
179 clickY = arg0.getY();
181 mouseClickX = arg0.getX();
182 mouseClickY = arg0.getY();
185 public void mouseReleased(MouseEvent arg0) {
186 if(selectedObject != null){
187 if(arg0.getX() != mouseClickX || arg0.getY() != mouseClickY){
188 int newX = this.getSelectedVertex().getX();
189 int newY = this.getSelectedVertex().getY();
190 int orgX = newX - ( arg0.getX() - mouseClickX);
191 int orgY = newY - ( arg0.getY() - mouseClickY);
192 frame.addAction(new Move(orgX,orgY,newX,newY,this.getSelectedVertex()));
197 @Override
198 public void mouseDragged(MouseEvent arg0) {
199 if(selectedObject != null){
200 selectedObject.setX(selectedObject.getX() + (arg0.getX() - clickX));
201 selectedObject.setY(selectedObject.getY() + (arg0.getY() - clickY));
202 clickX = arg0.getX();
203 clickY = arg0.getY();
207 @Override
208 public void mouseMoved(MouseEvent arg0) {
209 this.mouseX = arg0.getX();
210 this.mouseY = arg0.getY();
211 if(this.isAddingEdge){
212 this.object.repaint();
216 private void setGraphText(GraphVertex o, String text){
217 int width = 20 + this.getPanel().getDrawTextWidth(text);
218 o.setWidth(width);
219 o.setName(text);
222 private void removeLastCharacterFromInput(){
223 this.typedStr = this.typedStr.substring(0,this.typedStr.length()-1);
224 setGraphText(selectedObject,typedStr);
227 private void handleKey(int key)
229 switch(key){
230 case KeyEvent.VK_ENTER:
231 doChangeName();
232 break;
233 case KeyEvent.VK_BACK_SPACE:
234 removeLastCharacterFromInput();
235 break;
236 case KeyEvent.VK_ESCAPE:
237 doCancelNameChange();
238 break;
239 default:
240 break;
244 @Override
245 public void keyPressed(KeyEvent arg0) {
246 int key = arg0.getKeyCode();
247 if(this.isChangingName && selectedObject != null){
248 handleKey(key);
252 @Override
253 public void keyReleased(KeyEvent arg0) {
257 private boolean acceptKeyForName(char a){
258 String l = new String();
259 l += a;
260 String acceptKeys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_+=-`[]{};'\":<>?,./\\| «①∞⁵‰‽fl○";
261 return acceptKeys.contains(l);
264 @Override
265 public void keyTyped(KeyEvent arg0) {
266 // Todo Fix VK_ENTER + VK_ESCAPE
267 if(this.isChangingName && selectedObject != null && !arg0.isActionKey()){
268 if(arg0.getKeyChar() != KeyEvent.CHAR_UNDEFINED && acceptKeyForName(arg0.getKeyChar())){
269 this.typedStr += arg0.getKeyChar();
270 setGraphText(selectedObject,typedStr);